import { MESSAGE_TYPE } from '@/yichat.web.share/constants/messages'
import { applyPageFilters } from './helpers'

export const getSelectedChatConversation = ({
  allConversations,
  selectedChatId,
}) =>
  allConversations.filter(conversation => conversation.id === selectedChatId)

// getters
const getters = {
  getAllConversations: ({ allConversations }) =>
    allConversations.sort(
      (a, b) => b.messages.last()?.createdAt - a.messages.last()?.createdAt
    ),
  getSelectedChat: ({ selectedChatId, allConversations }) => {
    const selectedChat = allConversations.find(
      conversation => conversation.id === selectedChatId
    )
    return selectedChat || {}
  },
  getLastEmailInSelectedChat: (stage, _getters) => {
    const selectedChat = _getters.getSelectedChat
    const { messages = [] } = selectedChat
    const lastEmail = [...messages].reverse().find(message => {
      const {
        contentAttributes: contentAttributes = {},
        messageType: messageType,
      } = message
      const { email = {}} = contentAttributes
      const isIncomingOrOutgoing =
        messageType === MESSAGE_TYPE.OUTGOING ||
        messageType === MESSAGE_TYPE.INCOMING
      if (email.from && isIncomingOrOutgoing) {
        return true
      }
      return false
    })

    return lastEmail
  },
  getMineChats: (_state, _, __, rootGetters) => activeFilters => {
    const currentUserID = rootGetters.getCurrentUser?.id

    return _state.allConversations.filter(conversation => {
      const { assignee } = conversation.meta
      const isAssignedToMe = assignee && assignee.id === currentUserID
      const shouldFilter = applyPageFilters(conversation, activeFilters)
      const isChatMine = isAssignedToMe && shouldFilter

      return isChatMine
    })
  },
  getAppliedConversationFilters: _state => {
    return _state.appliedFilters
  },
  getUnAssignedChats: _state => activeFilters => {
    return _state.allConversations.filter(conversation => {
      const isUnAssigned = !conversation.meta.assignee
      const shouldFilter = applyPageFilters(conversation, activeFilters)
      return isUnAssigned && shouldFilter
    })
  },
  getAllStatusChats: _state => activeFilters => {
    return _state.allConversations.filter(conversation => {
      const shouldFilter = applyPageFilters(conversation, activeFilters)
      return shouldFilter
    })
  },
  getChatListLoadingStatus: ({ listLoadingStatus }) => listLoadingStatus,
  getAllMessagesLoaded (_state) {
    const [chat] = getSelectedChatConversation(_state)
    return !chat || chat.allMessagesLoaded === undefined
      ? false
      : chat.allMessagesLoaded
  },
  getUnreadCount (_state) {
    const [chat] = getSelectedChatConversation(_state)
    if (!chat) return []
    return chat.messages.filter(
      chatMessage =>
        chatMessage.createdAt > chat.agentLastSeenAt &&
        chatMessage.messageType === MESSAGE_TYPE.INCOMING &&
        chatMessage.private !== true
    ).length
  },
  getChatStatusFilter: ({ chatStatusFilter }) => chatStatusFilter,
  getSelectedInbox: ({ currentInbox }) => currentInbox,
  getConversationById: _state => conversationId => {
    return _state.allConversations.find(
      value => value.id === conversationId
    )
  },
}

export default getters
